package com.cloud.music.service.netease;

import com.alibaba.fastjson.JSONObject;
import com.cloud.music.annotation.Music;
import com.cloud.music.annotation.MusicService;
import com.cloud.music.dto.netease.*;
import org.springframework.validation.annotation.Validated;

import static com.cloud.music.constant.MusicConstant.NETEASERVICEADDRESS;

/**
 * 网易云音乐登录服务
 */
@MusicService(serverAddress = NETEASERVICEADDRESS)
public interface NeteaseCloudMusicService {

    /**
     * 手机登录
     *
     * @param loginCellphone 手机登录请求参数
     * @return JSONObject
     */
    @Music(url = "/login/cellphone")
    JSONObject loginCellphone(@Validated LoginCellphone loginCellphone);

    /**
     * 手机登录
     *
     * @param params 手机登录请求参数
     * @return JSONObject
     */
    @Music(url = "/login/cellphone")
    JSONObject loginCellphone(JSONObject params);

    /**
     * 邮箱登录
     *
     * @param login 邮箱登录请求参数
     * @return JSONObject
     */
    @Music(url = "/login")
    JSONObject login(@Validated Login login);

    /**
     * 邮箱登录
     *
     * @param params 邮箱登录请求参数
     * @return JSONObject
     */
    @Music(url = "/login")
    JSONObject login(JSONObject params);

    /**
     * 二维码 key 生成接口
     *
     * @return JSONObject
     */
    @Music(url = "/login/qr/key")
    JSONObject loginQrKey();

    /**
     * 二维码生成接口
     *
     * @param loginQrCreate 二维码生成接口请求参数
     * @return JSONObject
     */
    @Music(url = "/login/qr/create")
    JSONObject loginQrCreate(@Validated LoginQrCreate loginQrCreate);

    /**
     * 二维码生成接口
     *
     * @param params 二维码生成接口请求参数
     * @return JSONObject
     */
    @Music(url = "/login/qr/create")
    JSONObject loginQrCreate(JSONObject params);

    /**
     * 二维码检测扫码状态接口
     *
     * @param loginQrCheck 二维码检测扫码状态接口请求参数
     * @return JSONObject
     */
    @Music(url = "/login/qr/check")
    JSONObject loginQrCheck(@Validated LoginQrCheck loginQrCheck);

    /**
     * 二维码检测扫码状态接口
     *
     * @param params 二维码检测扫码状态接口请求参数
     * @return JSONObject
     */
    @Music(url = "/login/qr/check")
    JSONObject loginQrCheck(JSONObject params);

    /**
     * 发送验证码
     *
     * @param captchaSent 发送验证码请求参数
     * @return JSONObject
     */
    @Music(url = "/captcha/sent")
    JSONObject captchaSent(@Validated CaptchaSent captchaSent);

    /**
     * 游客登录
     *
     * @return JSONObject
     */
    @Music(url = "/register/anonimous")
    JSONObject registerAnonimous();

    /**
     * 刷新登录
     *
     * @return JSONObject
     */
    @Music(url = "/login/refresh")
    JSONObject loginRefresh();

    /**
     * 发送验证码
     *
     * @param params 发送验证码请求参数
     * @return JSONObject
     */
    @Music(url = "/captcha/sent")
    JSONObject captchaSent(JSONObject params);

    /**
     * 验证验证码
     *
     * @param captchaVerify 验证验证码请求参数
     * @return JSONObject
     */
    @Music(url = "/captcha/verify")
    JSONObject captchaVerify(@Validated CaptchaVerify captchaVerify);

    /**
     * 验证验证码
     *
     * @param params 验证验证码请求参数
     * @return JSONObject
     */
    @Music(url = "/captcha/verify")
    JSONObject captchaVerify(JSONObject params);

    /**
     * 注册(修改密码)
     *
     * @param registerCellphone 注册(修改密码)请求参数
     * @return JSONObject
     */
    @Music(url = "/register/cellphone")
    JSONObject registerCellphone(@Validated RegisterCellphone registerCellphone);

    /**
     * 注册(修改密码)
     *
     * @param params 注册(修改密码)请求参数
     * @return JSONObject
     */
    @Music(url = "/register/cellphone")
    JSONObject registerCellphone(JSONObject params);

    /**
     * 检测手机号码是否已注册
     *
     * @param cellphoneExistenceCheck 检测手机号码是否已注册请求参数
     * @return JSONObject
     */
    @Music(url = "/cellphone/existence/check")
    JSONObject cellphoneExistenceCheck(@Validated CellphoneExistenceCheck cellphoneExistenceCheck);

    /**
     * 检测手机号码是否已注册
     *
     * @param params 检测手机号码是否已注册请求参数
     * @return JSONObject
     */
    @Music(url = "/cellphone/existence/check")
    JSONObject cellphoneExistenceCheck(JSONObject params);

    /**
     * 初始化昵称
     *
     * @param activateInitProfile 初始化昵称请求参数
     * @return JSONObject
     */
    @Music(url = "/activate/init/profile")
    JSONObject activateInitProfile(@Validated ActivateInitProfile activateInitProfile);

    /**
     * 初始化昵称
     *
     * @param params 初始化昵称请求参数
     * @return JSONObject
     */
    @Music(url = "/activate/init/profile")
    JSONObject activateInitProfile(JSONObject params);

    /**
     * 重复昵称检测
     *
     * @param nicknameCheck 重复昵称检测请求参数
     * @return JSONObject
     */
    @Music(url = "/nickname/check")
    JSONObject nicknameCheck(@Validated NicknameCheck nicknameCheck);

    /**
     * 重复昵称检测
     *
     * @param params 重复昵称检测请求参数
     * @return JSONObject
     */
    @Music(url = "/nickname/check")
    JSONObject nicknameCheck(JSONObject params);

    /**
     * 更换绑定手机
     *
     * @param rebind 更换绑定手机请求参数
     * @return JSONObject
     */
    @Music(url = "/rebind")
    JSONObject rebind(@Validated Rebind rebind);

    /**
     * 更换绑定手机
     *
     * @param params 更换绑定手机请求参数
     * @return JSONObject
     */
    @Music(url = "/rebind")
    JSONObject rebind(JSONObject params);

    /**
     * 退出登录
     *
     * @return JSONObject
     */
    @Music(url = "/logout")
    JSONObject logout();

    /**
     * 登录状态
     *
     * @return JSONObject
     */
    @Music(url = "/login/status")
    JSONObject loginStatus();

    /**
     * 获取用户详情
     *
     * @param userDetail 获取用户详情请求参数
     * @return JSONObject
     */
    @Music(url = "/user/detail")
    JSONObject userDetail(@Validated UserDetail userDetail);

    /**
     * 获取用户详情
     *
     * @param params 获取用户详情请求参数
     * @return JSONObject
     */
    @Music(url = "/user/detail")
    JSONObject userDetail(JSONObject params);

    /**
     * 获取账号信息
     *
     * @return JSONObject
     */
    @Music(url = "/user/account")
    JSONObject userAccount();

    /**
     * 获取用户信息 , 歌单，收藏，mv, dj 数量
     *
     * @return JSONObject
     */
    @Music(url = "/user/subcount")
    JSONObject userSubcount();

    /**
     * 获取用户等级信息
     *
     * @return JSONObject
     */
    @Music(url = "/user/level")
    JSONObject userLevel();

    /**
     * 获取用户绑定信息
     *
     * @param userBinding 获取用户绑定信息请求参数
     * @return JSONObject
     */
    @Music(url = "/user/binding")
    JSONObject userBinding(@Validated UserBinding userBinding);

    /**
     * 获取用户绑定信息
     *
     * @param params 获取用户绑定信息请求参数
     * @return JSONObject
     */
    @Music(url = "/user/binding")
    JSONObject userBinding(JSONObject params);

    /**
     * 用户绑定手机
     *
     * @param userReplacephone 更新用户信息请求参数
     * @return JSONObject
     */
    @Music(url = "/user/replacephone")
    JSONObject userReplacephone(@Validated UserReplacephone userReplacephone);

    /**
     * 用户绑定手机
     *
     * @param params 更新用户信息请求参数
     * @return JSONObject
     */
    @Music(url = "/user/replacephone")
    JSONObject userReplacephone(JSONObject params);

    /**
     * 更新用户信息
     *
     * @param userUpdate 更新用户信息请求参数
     * @return JSONObject
     */
    @Music(url = "/user/update")
    JSONObject userUpdate(@Validated UserUpdate userUpdate);

    /**
     * 更新用户信息
     *
     * @param params 更新用户信息请求参数
     * @return JSONObject
     */
    @Music(url = "/user/update")
    JSONObject userUpdate(JSONObject params);

    /**
     * 更新头像
     *
     * @param avatarUpload 更新头像请求参数
     * @return JSONObject
     */
    @Music(url = "/avatar/upload")
    JSONObject avatarUpload(@Validated AvatarUpload avatarUpload);

    /**
     * 更新头像
     *
     * @param params 更新头像请求参数
     * @return JSONObject
     */
    @Music(url = "/avatar/upload")
    JSONObject avatarUpload(JSONObject params);

    /**
     * 私信和通知接口
     *
     * @return JSONObject
     */
    @Music(url = "/pl/count")
    JSONObject plCount();

    /**
     * 国家编码列表
     *
     * @return JSONObject
     */
    @Music(url = "/countries/code/list")
    JSONObject countriesCodeList();

    /**
     * 获取用户歌单
     *
     * @param userPlaylist 获取用户歌单请求参数
     * @return JSONObject
     */
    @Music(url = "/user/playlist")
    JSONObject userPlaylist(@Validated UserPlaylist userPlaylist);

    /**
     * 获取用户歌单
     *
     * @param params 获取用户歌单请求参数
     * @return JSONObject
     */
    @Music(url = "/user/playlist")
    JSONObject userPlaylist(JSONObject params);

    /**
     * 更新歌单
     *
     * @param playlistUpdate 更新歌单请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/update")
    JSONObject playlistUpdate(@Validated PlaylistUpdate playlistUpdate);

    /**
     * 更新歌单
     *
     * @param params 更新歌单请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/update")
    JSONObject playlistUpdate(JSONObject params);

    /**
     * 更新歌单描述
     *
     * @param playlistDescUpdate 更新歌单描述请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/desc/update")
    JSONObject playlistDescUpdate(@Validated PlaylistDescUpdate playlistDescUpdate);

    /**
     * 更新歌单描述
     *
     * @param params 更新歌单描述请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/desc/update")
    JSONObject playlistDescUpdate(JSONObject params);

    /**
     * 更新歌单名
     *
     * @param playlistNameUpdate 更新歌单名请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/name/update")
    JSONObject playlistNameUpdate(@Validated PlaylistNameUpdate playlistNameUpdate);

    /**
     * 更新歌单名
     *
     * @param params 更新歌单名请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/name/update")
    JSONObject playlistNameUpdate(JSONObject params);

    /**
     * 更新歌单标签
     *
     * @param playlistTagsUpdate 更新歌单标签请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/tags/update")
    JSONObject playlistTagsUpdate(@Validated PlaylistTagsUpdate playlistTagsUpdate);

    /**
     * 更新歌单标签
     *
     * @param params 更新歌单标签请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/tags/update")
    JSONObject playlistTagsUpdate(JSONObject params);

    /**
     * 歌单封面上传
     *
     * @param playlistCoverUpdate 歌单封面上传请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/cover/update")
    JSONObject playlistCoverUpdate(@Validated PlaylistCoverUpdate playlistCoverUpdate);

    /**
     * 歌单封面上传
     *
     * @param params 歌单封面上传请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/cover/update")
    JSONObject playlistCoverUpdate(JSONObject params);

    /**
     * 调整歌单顺序
     *
     * @param playlistOrderUpdate 调整歌单顺序请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/order/update")
    JSONObject playlistOrderUpdate(@Validated PlaylistOrderUpdate playlistOrderUpdate);

    /**
     * 调整歌单顺序
     *
     * @param params 调整歌单顺序请求参数
     * @return JSONObject
     */
    @Music(url = "/playlist/order/update")
    JSONObject playlistOrderUpdate(JSONObject params);

    /**
     * 调整歌曲顺序
     *
     * @param songOrderUpdate 调整歌曲顺序请求参数
     * @return JSONObject
     */
    @Music(url = "/song/order/update")
    JSONObject songOrderUpdate(@Validated SongOrderUpdate songOrderUpdate);

    /**
     * 调整歌曲顺序
     *
     * @param params 调整歌曲顺序请求参数
     * @return JSONObject
     */
    @Music(url = "/song/order/update")
    JSONObject songOrderUpdate(JSONObject params);

    /**
     * 获取用户历史评论
     *
     * @param userCommentHistory 获取用户历史评论请求参数
     * @return JSONObject
     */
    @Music(url = "/user/comment/history")
    JSONObject userCommentHistory(@Validated UserCommentHistory userCommentHistory);

    /**
     * 获取用户历史评论
     *
     * @param params 获取用户历史评论请求参数
     * @return JSONObject
     */
    @Music(url = "/user/comment/history")
    JSONObject userCommentHistory(JSONObject params);

    /**
     * 获取用户电台
     *
     * @param userDj 获取用户电台请求参数
     * @return JSONObject
     */
    @Music(url = "/user/dj")
    JSONObject userDj(@Validated UserDj userDj);

    /**
     * 获取用户电台
     *
     * @param params 获取用户电台请求参数
     * @return JSONObject
     */
    @Music(url = "/user/dj")
    JSONObject userDj(JSONObject params);

    /**
     * 获取用户关注列表
     *
     * @param userFollows 获取用户关注列表请求参数
     * @return JSONObject
     */
    @Music(url = "/user/follows")
    JSONObject userFollows(@Validated UserFollows userFollows);

    /**
     * 获取用户关注列表
     *
     * @param params 获取用户关注列表请求参数
     * @return JSONObject
     */
    @Music(url = "/user/follows")
    JSONObject userFollows(JSONObject params);

    /**
     * 获取用户粉丝列表
     *
     * @param userFolloweds 获取用户粉丝列表请求参数
     * @return JSONObject
     */
    @Music(url = "/user/followeds")
    JSONObject userFolloweds(@Validated UserFolloweds userFolloweds);

    /**
     * 获取用户粉丝列表
     *
     * @param params 获取用户粉丝列表请求参数
     * @return JSONObject
     */
    @Music(url = "/user/followeds")
    JSONObject userFolloweds(JSONObject params);

    /**
     * 获取用户动态
     *
     * @param userEvent 获取用户动态请求参数
     * @return JSONObject
     */
    @Music(url = "/user/event")
    JSONObject userEvent(@Validated UserEvent userEvent);

    /**
     * 获取用户动态
     *
     * @param params 获取用户动态请求参数
     * @return JSONObject
     */
    @Music(url = "/user/event")
    JSONObject userEvent(JSONObject params);

    /**
     * 转发用户动态
     *
     * @param eventForward 转发用户动态请求参数
     * @return JSONObject
     */
    @Music(url = "/event/forward")
    JSONObject eventForward(@Validated EventForward eventForward);

    /**
     * 转发用户动态
     *
     * @param params 转发用户动态请求参数
     * @return JSONObject
     */
    @Music(url = "/event/forward")
    JSONObject eventForward(JSONObject params);

    /**
     * 删除用户动态
     *
     * @param eventDel 删除用户动态请求参数
     * @return JSONObject
     */
    @Music(url = "/event/del")
    JSONObject eventDel(@Validated EventDel eventDel);

    /**
     * 删除用户动态
     *
     * @param params 删除用户动态请求参数
     * @return JSONObject
     */
    @Music(url = "/event/del")
    JSONObject eventDel(JSONObject params);

    /**
     * 分享文本、歌曲、歌单、mv、电台、电台节目到动态
     *
     * @param shareResource 分享文本、歌曲、歌单、mv、电台、电台节目到动态请求参数
     * @return JSONObject
     */
    @Music(url = "/share/resource")
    JSONObject shareResource(@Validated ShareResource shareResource);

    /**
     * 分享文本、歌曲、歌单、mv、电台、电台节目到动态
     *
     * @param params 分享文本、歌曲、歌单、mv、电台、电台节目到动态请求参数
     * @return JSONObject
     */
    @Music(url = "/share/resource")
    JSONObject shareResource(JSONObject params);
}

